/*
 * ArchivoAuxiliar.cpp
 *
 *  Created on: 19/05/2013
 *      Author: jonathan
 */

//El Archivo va a tener la siguiente organizacion
//ENTERO 4 VARIABLE LA LONGITUD DEL TERMINO
//TERMINO
//ENTERO 7 VARIABLE EL DOCUMENTO.
//ENTERO 7 VARIABLE LA POSICION.
#include "ArchivoAuxiliar.h"
#include <string>
ArchivoAuxiliar::ArchivoAuxiliar(FileName filename,
		fstream::openmode mode = fstream::in | fstream::out) {
	this->path = filename;
	this->stream = new BitStream(filename, mode);
}

ArchivoAuxiliar::~ArchivoAuxiliar() {
	delete this->stream;
//	cout<<"delete archivo auxiliar "<<endl;
}

void ArchivoAuxiliar::escribir(EntradaAuxiliar * entrada) {
	//escribo la longitud del termino
	escribirNumeroVariableLargo(this->stream, entrada->getTermino().size(),
			this->LONGITUD_BLOQUE_TEXTO);
	//escribo el termino
	string termino = entrada->getTermino();
	for (std::string::iterator it = termino.begin(); it != termino.end(); ++it) {
		this->stream->put(*it);
	}
	//escribo el documento
	escribirNumeroVariable(this->stream, entrada->getDocumento(),
			this->LONGITUD_BLOQUE_DOC);
	//escribo la cantidad de posiciones a escribir;
	escribirNumeroVariable(this->stream, entrada->getPosiciones().size(),
			this->LONGITUD_BLOQUE_DOC);
	list<EnteroLargo>::iterator it;
	for (it = entrada->getPosiciones().begin(); it
			!= entrada->getPosiciones().end(); ++it) {
		escribirNumeroVariable(this->stream, *it, this->LONGITUD_BLOQUE_DOC);
	}
	//escribo la posicion. por partes jack.
	//	this->utils.escribirNumeroVariable(this->stream, entrada.posicion, this->LONGITUD_BLOQUE_POS);
}

EntradaAuxiliar * ArchivoAuxiliar::next() {
	this->entrada = this->leer();
	return this->entrada;
}

void ArchivoAuxiliar::close() {
	//no se si funciona el open y close del stream.
	if (this->stream != 0) {
		this->stream->close();
		delete this->stream;
		this->stream = 0;
	}
}

EntradaAuxiliar * ArchivoAuxiliar::leer() {
	EnteroLargo caracteres = leerNumeroVariable(this->stream,
			this->LONGITUD_BLOQUE_TEXTO);
	string texto = "";
	for (EnteroLargo i = 0; i < caracteres; i++) {
		char caracter = this->stream->get();
		texto = texto + caracter;
	}
	EntradaAuxiliar * entrada = new EntradaAuxiliar(texto,
			leerNumeroVariable(this->stream, this->LONGITUD_BLOQUE_DOC));

	EnteroLargo cantPosiciones = leerNumeroVariable(this->stream,
			this->LONGITUD_BLOQUE_POS);
	for (EnteroLargo i = 0; i < cantPosiciones; i++) {
		entrada->addPosicion(
				leerNumeroVariable(this->stream, this->LONGITUD_BLOQUE_POS));
	}
	return entrada;
}

void ArchivoAuxiliar::open(FileName archivo,
		fstream::openmode mode = fstream::in | fstream::out) {
	//no se si funciona el open y close del stream.
	if (this->stream != 0) {
		this->close();
	}
	this->stream = new BitStream(archivo, mode);
}

//FileName ArchivoAuxiliar::getPath() {
//	return path;
//}


bool ArchivoAuxiliar::hasNext() {
	//Supongo que si hay un byte mas para leer va a haber un nuevo registro.
	return this->stream->hasNext();
}

EntradaAuxiliar * ArchivoAuxiliar::actual() {
	return this->entrada;
}
